/**
 * 
 */
package model.facade.persistence.mysql;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import model.core.torneo.Gara;
import model.core.utente.Giocatore;
import model.facade.persistence.GiocatoreDAO;

/**
 * @author Giuseppe Fusco (fusgius19@gmail.com)
 *
 */
public class GiocatoreDAO_MySQL extends MySQLDomainDAO implements GiocatoreDAO{

	/**
	 * @param dbms
	 * @throws SQLException 
	 */
	public GiocatoreDAO_MySQL(MySQLDBMS dbms) throws SQLException {
		super(dbms);
		// TODO Auto-generated constructor stub
	}
	
	/* (non-Javadoc)
	 * @see model.facade.persistence.PersistenceCommand#insert(java.lang.Object)
	 */
	@Override
	public boolean insert(Object obj) {
		// TODO Auto-generated method stub
		if(obj instanceof Giocatore){
			try {
				synchronized (obj) {
					Giocatore st = (Giocatore) obj;
					int n = MySQLUtentiQueryUtility.getIdStudente(st.getMatricola(), st.getPassword(), mys);
					if(n!=-1){
						Giocatore s = (Giocatore) obj;
						PreparedStatement r = mys.getPreparedStatement("insert into giocatore(partite_giocate,partite_vinte,partite_perse,totale_punti, tipo, idstudente) values(?,?,?,?,?,?)");
							r.setInt(1, s.getPartite_giocate());
							r.setInt(2, s.getPartite_vinte());
							r.setInt(3, s.getPartite_perse());
							r.setInt(4, s.getTotale_punti());
							r.setString(5, "SINGOLO");
							r.setInt(6, n);
							r.execute();
							r.close();
							return true;
					}else
						return false;	
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return false;
			}
		}
		else
			return false;
	}
	
	/* (non-Javadoc)
	 * @see model.facade.persistence.PersistenceCommand#delete(java.lang.Object)
	 */
	@Override
	public boolean delete(Object obj) {
		if(obj instanceof Gara){
			Giocatore g = (Giocatore)obj;
			try {
				mys.executeUpdate("delete from giocatore where idgiocatore=\""+MySQLUtentiQueryUtility.getIdGiocatore(g, mys)+"\"");
				return true;
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return false;
			}
		}else return false;
	}

	/* (non-Javadoc)
	 * @see model.facade.persistence.PersistenceCommand#update(java.lang.Object)
	 */
	@Override
	public boolean update(Object obj) {
		if(obj instanceof Giocatore){
			try {
				synchronized (obj) {
					Giocatore s = (Giocatore) obj;
					ResultSet r = mys.getResult("select * from studente where matricola=\""+s.getMatricola()+"\"");
					if(r.first()){
						r.updateString("nome", s.getNome());
						r.updateString("cognome", s.getCognome());
						r.updateString("matricola", s.getMatricola());
						r.updateString("password", s.getPassword());
						r.updateInt("anno_corso", s.getAnno_corso());
						r.updateInt("anno_immatricolazione", s.getAnno_immatricolazione());
						r.updateDate("data_nascita", new Date(s.getData_nascita().getTimeInMillis()));
						r.updateRow();
						
						r = mys.getResult("select * from giocatore where idstudente="+r.getInt(1));
						r.updateInt("partite_giocate", s.getPartite_giocate());
						r.updateInt("partite_vinte", s.getPartite_vinte());
						r.updateInt("partite_perse", s.getPartite_perse());
						r.updateInt("totale_punti", s.getTotale_punti());
						r.updateRow();
						r.close();
						return true;
					}else
						return false;	
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				return false;
			}
		}
		else
			return false;
	}

	@Override
	public Giocatore retrieve(Object... properties) {
		// TODO Auto-generated method stub
		if(properties!=null && properties.length==2){
			Object o1=properties[0];
			Object o2=properties[1];
			if(o1 instanceof String && o2 instanceof String){
				try {
					int n = MySQLUtentiQueryUtility.getIdStudente((String)o1, (String)o2, mys);
					if(n!=-1){
						return MySQLUtentiQueryUtility.getGiocatoreByIdStudente(n, mys);
					}else
						return null;
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					return null;
				}
				
			}else
				return null;
		}
		else
			return null;
	}
	
	public List<Giocatore> load(String text) throws SQLException{
		List<Giocatore> list = new ArrayList<Giocatore>();
		ResultSet r = mys.getResult("select * from giocatore where tipo like\"%SINGOLO%\" and (partite_giocate like\"%"+text+"%\" or " +
				"partite_vinte like\"%"+text+"%\" or partite_perse like\"%"+text+"%\" or totale_punti like\"%"+text+"%\")");
		while(r.next()){
			list.add(MySQLUtentiQueryUtility.getGiocatoreByIdStudente(r.getInt("idstudente"), mys));
		}
		r.close();
		return list;
	}

}
